package com.carlinfo.usercenter.common.test;

import java.lang.reflect.Field;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import java.util.Arrays;

import com.carlinfo.userscenter.users.pojo.ARole;

/**
 * ...:方法的定义的使用,在调用的时候,参数的个数随便填写,当成数组处理
 * ...:当做参数只能放到最后一个参数 
 * 测试反射的例子
 * @author jjh
 *
 */
public class ReflectMain
{
	public static void main(String[] args)
	{
		/* 对Class文件描述的对象,Class */
		
		try
		{
			/* 获取Class对象的第一种方法 
			 * 方法一:调用Class.forName */
			Class pojoCla1 = Class.forName("com.carlinfo.userscenter.users.pojo.ARole");
			System.out.println("====pojoCla1==" + pojoCla1);
			
			/**
			 * 方法二:
			 * 类名.class
			 */
			Class pojoCla2 = ARole.class ;
			System.out.println("===pojoCla2==" + pojoCla2);
			/**
			 * 方法三:
			 * 对象.getClass();
			 */
			ARole role = new ARole();
			Class pojoCla3 = role.getClass();
			System.out.println("===pojoCla3==" + pojoCla3);
			
			/* 获取属性 
			 * getFields;获取公共的字段(被public)修饰
			 * getDeclareedFields;取到所有的字段
			 * */
			Field[] fields = pojoCla1.getDeclaredFields();
			/* 如何循环数组 */
			System.out.println("Field===Array.toString==" + Arrays.toString(fields));
			/* 第二种 */
			for(int i = 1 ; i < fields.length ; i ++)
			{
				Field field = fields[i] ;
				System.out.println(i +"===Field循环==" + field.getName());
			}
			/* 获取方法 */
			Method [] methods = pojoCla1.getMethods();
			/* 如何循环数组 */
			System.out.println("===Method==Arrays.toString==" + Arrays.toString(methods));
			for(int i = 1 ; i < methods.length ; i ++)
			{
				Method method = methods[i];
				System.out.println(i +"===method循环==" + method.getName());
			}
			
			/**
			 * 执行方法
			 * ARole role = new ARole();
			 * role.setName("测试三");
			 * System.out.println("====" + role.getName());
			 */
			System.out.println("=====setNameMethod开始调用=======");
			/**
			 * setName，getName
			 * 需要获取到Method对象
			 * 调用invoke方法
			 * 
			 * 参数1:方法名
			 * 参数2:方法的参数类型
			 */
			Method setNameMethod = pojoCla1.getMethod("setName", String.class);
			/* 如何通过Class,生成一个对象 */
			Object obj = pojoCla1.newInstance();
			System.out.println("===newInstance==" + obj);
			/**
			 * 执行setName方法
			 * 参数1:是Class对应的一个对象
			 * 参数3:实参,调用方法实实在在传的值
			 * 返回值是方法的返回值
			 */
			Object res = setNameMethod.invoke(obj, "测试啦");
			/* setName没有返回值 */
			System.out.println("====setNameMethod.invoke==" + res);
			
			
			System.out.println("=====getNameMethod开始调用====");
			/**
			 * getName方法没有参数,就不用传
			 */
			Method getNameMethod = pojoCla1.getMethod("getName");
			/**
			 * 执行setName方法
			 * 参数1;是class对应的一个对象
			 * 参数2:实参,调用方法实实在在传的值
			 * 返回值是方法的返回值 
			 */
			Object getNameRes = getNameMethod.invoke(obj);
			/* getName有返回值 */
			System.out.println("===getNameMethod.invoke==" + getNameRes);
		} catch (ClassNotFoundException e)
		{
			e.printStackTrace();
		} catch (NoSuchMethodException e)
		{
			e.printStackTrace();
		} catch (SecurityException e)
		{
			e.printStackTrace();
		} catch (InstantiationException e)
		{
			e.printStackTrace();
		} catch (IllegalAccessException e)
		{
			e.printStackTrace();
		} catch (IllegalArgumentException e)
		{
			e.printStackTrace();
		} catch (InvocationTargetException e)
		{
			e.printStackTrace();
		}
		
		
	}
}
